package com.ourcraft.informationcollectionsystem.utils.authority;

import io.jsonwebtoken.*;

import java.util.Date;

/**
 * 用于生成token和token解析
 *
 * @author Z0136
 * @since 2023/10/29
 */
public class JWTUtils {
    private static final long expire = 24 * 60 * 60; // token过期时间
    private static final String secret = "ourcraft"; // token加密密钥

    /**
     * 为指定的用户账号和用户权限生成token
     *
     * @param userId        用户账号
     * @param userAuthority 用户权限
     * @return 生成的token
     */
    public static String generateToken(Integer userId, Integer userAuthority) {
        Date now = new Date();
        Date expireDate = new Date(now.getTime() + expire * 1000);
        return Jwts.builder()
                .setHeaderParam("type", "JWT") // 设置token类型
                .setSubject(userId.toString() + "@" + userAuthority.toString()) // 设置token主体内容，用'@'分隔
                .setIssuedAt(now) // 设置生效时间
                .setExpiration(expireDate) // 设置过期时间
                .signWith(SignatureAlgorithm.HS512, secret) // 设置加密算法和密钥
                .compact();
    }

    /**
     * 验证token是否合法
     *
     * @param token 需要验证的token
     * @return 验证结果
     */
    public static String validateToken(String token) {
        try {
            // 尝试解析
            Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
            return "valid";
        }
        // token过期
        catch (ExpiredJwtException e) {
            return "expired";
        }
        // 解析失败
        catch (JwtException e) {
            return "wrong";
        }
    }

    /**
     * 获得token解析后的主体部分
     *
     * @param token 需要解析的token
     * @return 解析后的主体部分
     */
    public static Claims getClaimsByToken(String token) {
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 获得token中的用户账号信息
     *
     * @param token 需要解析的token
     * @return 用户账号
     */
    public static Integer getUserIdByToken(String token) {
        return Integer.valueOf(getClaimsByToken(token).getSubject().split("@")[0]);
    }

    /**
     * 获得token中的用户权限信息
     *
     * @param token 需要解析的token
     * @return 用户权限
     */
    public static Integer getAuthorityByToken(String token) {
        return Integer.valueOf(getClaimsByToken(token).getSubject().split("@")[1]);
    }
}
